home *** CD-ROM | disk | FTP | other *** search
/ Technotools / Technotools (Chestnut CD-ROM)(1993).ISO / lang_oth / sawyer / memory.4th < prev   
Text File  |  1986-04-25  |  5KB  |  114 lines

  1. -->  \ Extended Memory Access      Screen 0 of 6      19JAN84RES
  2. Most versions of FORTH live in a 64 Kbyte segment of memory --
  3. dictionary, stacks, disk buffers, etc., are confined to one such
  4. segment. Furthermore, some versions have no words to even refer
  5. to other parts of memory, limiting all address references to 16
  6. bits ( one stack item ).
  7. The following six screens define "extended memory access" words
  8. for transfer of data to/from any part of 1 Mbyte of memory, in
  9. the address range  00000. - FFFFF.
  10. @_  ( da -- n)  fetches a 16-bit word from da, eg, ABCDE. @_
  11. !_  ( n da --)  stores  "    "   "    at da, eg, 1234 ABCDE. !_
  12. C@_ ( da -- c)  fetches an 8-bit byte from da, eg, ABCDE. C@_
  13. C!_ ( c da --)  stores  "    "   "    at da, eg, 12 ABCDE. C!_
  14. DUMP_ ( da n --)  displays n bytes of memory beginning at da
  15.  
  16.                -- Bob Sawyer,  Torrance CA --
  17. \ Extended Memory Access      Screen 1 of 6           19JAN84RES
  18.  
  19. HEX    ASSEMBLER
  20.                                 \ set up new  seg:offset using
  21. CREATE  NEW-SEG                 \ 20-bit address ZYXWV in AX DX:
  22.        ( AX DX -- DX DI)        \    000Z in AX, YXWV in DX
  23.         AX, # 1         ROR     \ rotate 000Z to Z000
  24.         AX, # 1         ROR
  25.         AX, # 1         ROR
  26.         AX, # 1         ROR
  27.         DX              PUSH    \ move YXWV from DX to DI
  28.         DI              POP
  29.         DX, AX          MOV     \ move Z000 into DX
  30.                         RET     \ new  seg:offset  ( Z000:YXWV )
  31.                        -->      \    is in  DX:DI
  32.  
  33. \ Extended Memory Access        Screen 2 of 6         19JAN84RES
  34.  
  35. CODE @_  ( da -- n)             \ 20-bit addr on stack as double
  36.                                 \   word; eg,  B8000.  @_   will
  37.                                 \   fetch the 16 bits at B8000.
  38.         AX              POP     \ put hi word in AX
  39.         DX              POP     \ put lo word in DX
  40.         NEW-SEG         CALL    \ new   seg:offset   is DX:DI
  41.         AX, DS          MOV     \ save current segment in AX
  42.         DS, DX          MOV     \ load new segment
  43.         CX, [DI]        MOV     \ fetch data from seg:offset
  44.         CX              PUSH    \ put data on stack
  45.         DS, AX          MOV     \ restore old segment
  46.         NEXT            JMP
  47. END-CODE                -->
  48.  
  49. \ Extended Memory Access        Screen 3 of 6         19JAN84RES
  50.  
  51. CODE !_ ( n da)                 \ eg.,  10A3 B8C65. !_  will
  52.                                 \  move value 10A3 to B8C65.
  53.         AX              POP
  54.         DX              POP
  55.         NEW-SEG         CALL
  56.         CX, DS          MOV
  57.         DS, DX          MOV
  58.         BX              POP
  59.         [DI], BX        MOV
  60.         DS, CX          MOV
  61.         NEXT            JMP
  62. END-CODE                -->
  63.  
  64.  
  65. \ Extended Memory Access        Screen 4 of 6         19JAN84RES
  66.  
  67. CODE C@_  ( da -- c)            \ 20-bit addr on stack as double
  68.                                 \   word; eg,  B8000.  C@_  will
  69.                                 \   fetch the byte at B8000.
  70.         AX              POP     \ put hi word in AX
  71.         DX              POP     \ put lo word in DX
  72.         NEW-SEG         CALL    \ new   seg:offset   is DX:DI
  73.         CX, DS          MOV     \ save current segment in AX
  74.         DS, DX          MOV     \ load new segment
  75.         AX, AX          SUB     \ clear AX
  76.         AL, [DI]        MOV     \ fetch data from seg:offset
  77.         AX              PUSH    \ put data on stack
  78.         DS, CX          MOV     \ restore old segment
  79.         NEXT            JMP
  80. END-CODE                -->
  81. \ Extended Memory Access        Screen 5 of 6         19JAN84RES
  82.  
  83. CODE C!_ ( c da)                \ eg.,   A3 B8C65. C!_  will
  84.                                 \  move value A3 to B8C65.
  85.         AX              POP
  86.         DX              POP
  87.         NEW-SEG         CALL
  88.         CX, DS          MOV
  89.         DS, DX          MOV
  90.         BX              POP
  91.         [DI], BL        MOV
  92.         DS, CX          MOV
  93.         NEXT            JMP
  94. END-CODE                -->
  95.  
  96.  
  97. \ Extended memory dump (byte/ASCII)   Screen 6 of 6   19JAN84RES
  98. HEX
  99. : ?PRINTABLE ( c -- f)  DUP 19 > SWAP 7F < AND ;
  100. : DISP ( da --)  \ display 16 bytes beginning at given addr
  101.         10 0 DO 2DUP I DUP 8 = 2* SPACES 1 U* D+ C@_ 2 U.R
  102.                  SPACE LOOP  2 SPACES
  103.         10 0 DO 2DUP I 1 U* D+ C@_
  104.             DUP ?PRINTABLE NOT IF DROP 0FA THEN EMIT LOOP
  105.         2DROP CR ;
  106. : HEAD  ( da) DROP ." Address" 4 SPACES 10 0 DO DUP 0F AND 1 U.R
  107.     2 SPACES  I 7 = 2* SPACES 1+ LOOP  SPACE 10 0 DO DUP 0F AND
  108.     1 U.R 1+ LOOP  DROP CR ;
  109. : DUMP_  ( da n --) \ dump any part of memory 16 bytes per row
  110.     CR  CR  BASE @  >R  HEX  ROT ROT 2DUP HEAD CR ROT 0 DO 2DUP
  111.             I 1 U* D+ 2DUP 6 D.R 4 SPACES  DISP 10 +LOOP
  112.         2DROP  R>  BASE ! ;                     CR ." HEX " CR
  113. DUP
  114.             I 1 U* D+ 2DUP 6 D.R 4 SPACES  DISP 10